<?php

namespace app\adminapi\controller;

use think\Controller;
use think\Request;

class Type extends BaseApi
{
    /**
     * 显示资源列表
     *
     * @return \think\Response
     */
    public function index()
    {
        $data = \app\common\model\Type::field("id,type_name,create_time")->select();
        $this->ok($data);
    }

    /**
     * 保存新建的资源
     *
     * @param  \think\Request  $request
     * @return \think\Response
     */
    public function save(Request $request)
    {
        # 接收数据
        $params = input();
        # 检测数据
        $validata = $this->validate($params, [
            "type_name" => "require",
            "spec"  => "array",
            "attr"  => "array",
        ]);
        if ($validata !== true) {
            $this->fail($validata);
        }
        # 数据处理
        # 使用事务进行一个数据的处理，如果有一个失败那就全部都失败
        \think\Db::startTrans();
        try {
            # 添加type数据
            $type = \app\common\model\Type::create($params, true);
            # 循环添加里面的数据判断他是不是为，如果为空那就删除他传入进来的循环到的一条数据
            foreach ($params["spec"] as $k => $v) {
                # 判断他循环到的数据是否为空
                if (empty($v["name"])) {
                    # 删除循环到的这条数据
                    unset($params["spec"][$k]);
                    # 跳出循环
                    continue;
                }
                # 判断他循环到的数据sort是否为空
                if (empty($v["sort"])) {
                    # 删除循环到的这条数据
                    unset($params["spec"][$k]);
                    # 跳出循环
                    continue;
                }
                # 判断他循环的value是不是一个数组
                if (!is_array($v["value"])) {
                    # 删除循环到的这条数据
                    unset($params["spec"][$k]);
                    # 跳出循环
                    continue;
                }
                # 循环判断value里面的数据是否为空，如果是那就删除空的数据
                foreach ($v["value"] as $key => $val) {
                    # 判断他循环到的数据是否为空
                    if (empty($val)) {
                        # 如果是空的数据那就删除
                        unset($params["spec"][$k]["value"][$key]);
                    }
                }
                # 再次判断他value里面是否还有数据，如果没有那就删除整条数据
                if (empty($params["spec"][$k]["value"])) {
                    unset($params["spec"][$k]);
                    continue;
                }
            }
            # 循环把传入进来的数据里面spec数据单独获取出来进行添加
            $spec_data = [];
            foreach ($params["spec"] as $k => $v) {
                $spec_data[] = [
                    "spec_name" => $v["name"],
                    "type_id"   => $type["id"],
                    "sort"      => $v["sort"]
                ];
            }
            $spec_model = new \app\common\model\Spec();
            # 添加多条数据
            $spec_res = $spec_model->saveAll($spec_data);
            # 循环把传入进来的数据里面spec_value数据单独获取出来进行添加
            $spec_value_data = [];
            foreach ($params["spec"] as $k => $v) {
                foreach ($v["value"] as $val) {
                    $spec_value_data[] = [
                        "spec_id" => $spec_res[$k]["id"],
                        "type_id" => $type["id"],
                        "spec_value" => $val
                    ];
                }
            }
            $spec_value_model = new \app\common\model\SpecValue();
            $spec_value_model->saveAll($spec_value_data);
            /**
             * 'attr' => [
             *      ['name' => '毛重', 'sort'=>50, 'value' => []],
             *      ['name' => '产地', 'sort'=>50, 'value' => ['进口', '国产']],
             * ]
             */
            # 循环数据里面的attr属性名称 
            foreach ($params["attr"] as $k => $v) {
                # 判断他是否为空，如果为空那就删除掉循环到的那一条数据
                if (empty($v["name"])) {
                    unset($params["attr"][$k]);
                    continue;
                }
                # 判断他是不是一个数组，如果不是那就默认变成一个空的数组
                if (!is_array($v["value"])) {
                    $params["attr"][$k]["value"] = [];
                }
                foreach ($v["value"] as $key => $val) {
                    # 判断他vlaue里面的数据是不是都是空字符串，如果是那就删除掉
                    if (empty($val)) {
                        unset($params["attr"][$k]["value"][$key]);
                    }
                }
            }
            $attr_data = [];
            # 循环把传入进来的数据里面attribute数据单独获取出来进行添加
            foreach ($params["attr"] as $k => $v) {
                $attr_data[] = [
                    "attr_name" => $v["name"],
                    "type_id"   => $type["id"],
                    "attr_values" => implode(",", $v["value"]),
                    "sort" => $v["sort"]
                ];
            }
            $attr_model = new \app\common\model\Attribute();
            $attr_model->saveAll($attr_data);
            // 提交事务
            \think\Db::commit();
            $this->ok();
        } catch (\Exception $e) {
            // 回滚事务
            \think\Db::rollback();
            $msg = $e->getMessage();
            $line = $e->getLine();
            $file = $e->getFile();
            $this->fail($msg .  $file . $line);
        }

        # 返回数据
    }

    /**
     * 显示指定的资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function read($id)
    {
        $list = \app\common\model\Type::with("specs,specs.spec_value,attribute")->find($id);
        $this->ok($list);
    }
    /**
     * 保存更新的资源
     *
     * @param  \think\Request  $request
     * @param  int  $id
     * @return \think\Response
     */
    public function update(Request $request, $id)
    {
        # 接收数据
        $params = input();
        # 检测数据
        $validata = $this->validate($params, [
            "type_name" => "require",
            "spec"  => "array",
            "attr"  => "array",
        ]);
        if ($validata !== true) {
            $this->fail($validata);
        }
        # 数据处理
        # 启动事务
        \think\Db::startTrans();
        # 开启事务
        try {
            # 修改type表
            \app\common\model\Type::update($params, ["id" => $id], true);
            # 循环添加里面的数据判断他是不是为，如果为空那就删除他传入进来的循环到的一条数据
            foreach ($params["spec"] as $k => $v) {
                # 判断他循环到的数据是否为空
                if (empty($v["name"])) {
                    # 删除循环到的这条数据
                    unset($params["spec"][$k]);
                    # 跳出循环
                    continue;
                }
                # 判断他循环到的数据sort是否为空
                if (empty($v["sort"])) {
                    # 删除循环到的这条数据
                    unset($params["spec"][$k]);
                    # 跳出循环
                    continue;
                }
                # 判断他循环的value是不是一个数组
                if (!is_array($v["value"])) {
                    # 删除循环到的这条数据
                    unset($params["spec"][$k]);
                    # 跳出循环
                    continue;
                }
                # 循环判断value里面的数据是否为空，如果是那就删除空的数据
                foreach ($v["value"] as $key => $val) {
                    # 判断他循环到的数据是否为空
                    if (empty($val)) {
                        # 如果是空的数据那就删除
                        unset($params["spec"][$k]["value"][$key]);
                    }
                }
                # 再次判断他value里面是否还有数据，如果没有那就删除整条数据
                if (empty($params["spec"][$k]["value"])) {
                    unset($params["spec"][$k]);
                    continue;
                }
            }
            # 循环把传入进来的数据里面spec数据单独获取出来进行添加
            $spec_data = [];
            foreach ($params["spec"] as $k => $v) {
                $spec_data[] = [
                    "spec_name" => $v["name"],
                    "type_id"   => $id,
                    "sort"      => $v["sort"]
                ];
            }
            \app\common\model\Spec::destroy(["type_id" => $id]);
            $spec_model = new \app\common\model\Spec();
            # 添加多条数据
            $spec_res = $spec_model->saveAll($spec_data);
            # 循环把传入进来的数据里面spec_value数据单独获取出来进行添加
            $spec_value_data = [];
            foreach ($params["spec"] as $k => $v) {
                foreach ($v["value"] as $val) {
                    $spec_value_data[] = [
                        "spec_id" => $spec_res[$k]["id"],
                        "type_id" => $id,
                        "spec_value" => $val
                    ];
                }
            }
            \app\common\model\SpecValue::destroy(["type_id" => $id]);
            $spec_value_model = new \app\common\model\SpecValue();
            $spec_value_model->saveAll($spec_value_data);
            /**
             * 'attr' => [
             *      ['name' => '毛重', 'sort'=>50, 'value' => []],
             *      ['name' => '产地', 'sort'=>50, 'value' => ['进口', '国产']],
             * ]
             */
            # 循环数据里面的attr属性名称 
            foreach ($params["attr"] as $k => $v) {
                # 判断他是否为空，如果为空那就删除掉循环到的那一条数据
                if (empty($v["name"])) {
                    unset($params["attr"][$k]);
                    continue;
                }
                # 判断他是不是一个数组，如果不是那就默认变成一个空的数组
                if (!is_array($v["value"])) {
                    $params["attr"][$k]["value"] = [];
                }
                foreach ($v["value"] as $key => $val) {
                    # 判断他vlaue里面的数据是不是都是空字符串，如果是那就删除掉
                    if (empty($val)) {
                        unset($params["attr"][$k]["value"][$key]);
                    }
                }
            }
            $attr_data = [];
            # 循环把传入进来的数据里面attribute数据单独获取出来进行添加
            foreach ($params["attr"] as $k => $v) {
                $attr_data[] = [
                    "attr_name" => $v["name"],
                    "type_id"   => $id,
                    "attr_values" => implode(",", $v["value"]),
                    "sort" => $v["sort"]
                ];
            }
            \app\common\model\Attribute::destroy(["type_id" => $id]);
            $attr_model = new \app\common\model\Attribute();
            $attr_model->saveAll($attr_data);
            # 提交事务
            \think\Db::commit();
            $this->ok();
        } catch (\Exception $e) {
            # 事务回滚
            \think\Db::rollback();
            $msg = $e->getMessage();
            $line = $e->getLine();
            $file = $e->getFile();
            $this->fail($msg . $file . $line);
        }
        # 返回数据
    }

    /**
     * 删除指定资源
     *
     * @param  int  $id
     * @return \think\Response
     */
    public function delete($id)
    {
        # 启动事务
        \think\Db::startTrans();
        try {
            # 删除type表
            \app\common\model\Type::destroy($id);
            # 删除spec表
            \app\common\model\Spec::destroy(["type_id" => $id]);
            # 删除spec_value表
            \app\common\model\SpecValue::destroy(["type_id" => $id]);
            # 删除attribute表
            \app\common\model\Attribute::destroy(["type_id" => $id]);
            # 提交事务
            \think\Db::commit();
            $this->ok();
        } catch (\Exception $e) {
            # 回滚事务
            \think\Db::rollback();
            $this->ok();
        }
    }
}
